//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS SimSpaceWeaver service.
///
/// SimSpace Weaver (SimSpace Weaver)  is a service that you can use to build and run  large-scale spatial simulations in the Amazon Web Services Cloud. For example, you can create crowd simulations, large real-world environments, and immersive and interactive experiences. For more information about SimSpace Weaver, see the  SimSpace Weaver User Guide . This API reference describes the API operations and data types that you can use to communicate directly with SimSpace Weaver. SimSpace Weaver also provides the SimSpace Weaver app SDK, which you use for app development. The SimSpace Weaver app SDK API reference is included in the SimSpace Weaver app SDK documentation. This documentation is part of the SimSpace Weaver app SDK distributable package.
public struct SimSpaceWeaver: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the SimSpaceWeaver client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            serviceName: "SimSpaceWeaver",
            serviceIdentifier: "simspaceweaver",
            serviceProtocol: .restjson,
            apiVersion: "2022-10-28",
            endpoint: endpoint,
            variantEndpoints: Self.variantEndpoints,
            errorType: SimSpaceWeaverErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }




    /// FIPS and dualstack endpoints
    static var variantEndpoints: [EndpointVariantType: AWSServiceConfig.EndpointVariant] {[
        [.fips]: .init(endpoints: [
            "us-gov-east-1": "simspaceweaver.us-gov-east-1.amazonaws.com",
            "us-gov-west-1": "simspaceweaver.us-gov-west-1.amazonaws.com"
        ])
    ]}

    // MARK: API Calls

    /// Creates a snapshot of the specified simulation.  A snapshot is a file that contains simulation state data at a specific time. The state data saved in a snapshot includes entity data from the State Fabric,  the simulation configuration specified in the schema, and the clock tick number.  You can use the snapshot to initialize a new simulation.  For more information about snapshots, see Snapshots in the SimSpace Weaver User Guide.  You specify a Destination when you create a snapshot. The Destination is the name of an Amazon S3 bucket and an optional ObjectKeyPrefix. The ObjectKeyPrefix is usually the name of a folder in the bucket. SimSpace Weaver creates a  snapshot folder inside the Destination and  places the snapshot file there. The snapshot file is an Amazon S3 object. It has an object key with the form:  object-key-prefix/snapshot/simulation-name-YYMMdd-HHmm-ss.zip, where:      YY is the 2-digit year     MM is the 2-digit month     dd is the 2-digit day of the month     HH is the 2-digit hour (24-hour clock)     mm is the 2-digit minutes     ss is the 2-digit seconds
    @Sendable
    @inlinable
    public func createSnapshot(_ input: CreateSnapshotInput, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateSnapshotOutput {
        try await self.client.execute(
            operation: "CreateSnapshot", 
            path: "/createsnapshot", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a snapshot of the specified simulation.  A snapshot is a file that contains simulation state data at a specific time. The state data saved in a snapshot includes entity data from the State Fabric,  the simulation configuration specified in the schema, and the clock tick number.  You can use the snapshot to initialize a new simulation.  For more information about snapshots, see Snapshots in the SimSpace Weaver User Guide.  You specify a Destination when you create a snapshot. The Destination is the name of an Amazon S3 bucket and an optional ObjectKeyPrefix. The ObjectKeyPrefix is usually the name of a folder in the bucket. SimSpace Weaver creates a  snapshot folder inside the Destination and  places the snapshot file there. The snapshot file is an Amazon S3 object. It has an object key with the form:  object-key-prefix/snapshot/simulation-name-YYMMdd-HHmm-ss.zip, where:      YY is the 2-digit year     MM is the 2-digit month     dd is the 2-digit day of the month     HH is the 2-digit hour (24-hour clock)     mm is the 2-digit minutes     ss is the 2-digit seconds
    ///
    /// Parameters:
    ///   - destination: The Amazon S3 bucket and optional folder (object key prefix) where SimSpace Weaver creates the snapshot file. The Amazon S3 bucket must be in the same Amazon Web Services Region as the simulation.
    ///   - simulation: The name of the simulation.
    ///   - logger: Logger use during operation
    @inlinable
    public func createSnapshot(
        destination: S3Destination,
        simulation: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateSnapshotOutput {
        let input = CreateSnapshotInput(
            destination: destination, 
            simulation: simulation
        )
        return try await self.createSnapshot(input, logger: logger)
    }

    /// Deletes the instance of the given custom app.
    @Sendable
    @inlinable
    public func deleteApp(_ input: DeleteAppInput, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteAppOutput {
        try await self.client.execute(
            operation: "DeleteApp", 
            path: "/deleteapp", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes the instance of the given custom app.
    ///
    /// Parameters:
    ///   - app: The name of the app.
    ///   - domain: The name of the domain of the app.
    ///   - simulation: The name of the simulation of the app.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteApp(
        app: String,
        domain: String,
        simulation: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteAppOutput {
        let input = DeleteAppInput(
            app: app, 
            domain: domain, 
            simulation: simulation
        )
        return try await self.deleteApp(input, logger: logger)
    }

    /// Deletes all SimSpace Weaver resources assigned to the given simulation.  Your simulation uses resources in other Amazon Web Services. This API operation doesn't delete resources in other Amazon Web Services.
    @Sendable
    @inlinable
    public func deleteSimulation(_ input: DeleteSimulationInput, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteSimulationOutput {
        try await self.client.execute(
            operation: "DeleteSimulation", 
            path: "/deletesimulation", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes all SimSpace Weaver resources assigned to the given simulation.  Your simulation uses resources in other Amazon Web Services. This API operation doesn't delete resources in other Amazon Web Services.
    ///
    /// Parameters:
    ///   - simulation: The name of the simulation.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteSimulation(
        simulation: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteSimulationOutput {
        let input = DeleteSimulationInput(
            simulation: simulation
        )
        return try await self.deleteSimulation(input, logger: logger)
    }

    /// Returns the state of the given custom app.
    @Sendable
    @inlinable
    public func describeApp(_ input: DescribeAppInput, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeAppOutput {
        try await self.client.execute(
            operation: "DescribeApp", 
            path: "/describeapp", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the state of the given custom app.
    ///
    /// Parameters:
    ///   - app: The name of the app.
    ///   - domain: The name of the domain of the app.
    ///   - simulation: The name of the simulation of the app.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeApp(
        app: String,
        domain: String,
        simulation: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeAppOutput {
        let input = DescribeAppInput(
            app: app, 
            domain: domain, 
            simulation: simulation
        )
        return try await self.describeApp(input, logger: logger)
    }

    /// Returns the current state of the given simulation.
    @Sendable
    @inlinable
    public func describeSimulation(_ input: DescribeSimulationInput, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeSimulationOutput {
        try await self.client.execute(
            operation: "DescribeSimulation", 
            path: "/describesimulation", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the current state of the given simulation.
    ///
    /// Parameters:
    ///   - simulation: The name of the simulation.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeSimulation(
        simulation: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeSimulationOutput {
        let input = DescribeSimulationInput(
            simulation: simulation
        )
        return try await self.describeSimulation(input, logger: logger)
    }

    /// Lists all custom apps or service apps for the given simulation and domain.
    @Sendable
    @inlinable
    public func listApps(_ input: ListAppsInput, logger: Logger = AWSClient.loggingDisabled) async throws -> ListAppsOutput {
        try await self.client.execute(
            operation: "ListApps", 
            path: "/listapps", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists all custom apps or service apps for the given simulation and domain.
    ///
    /// Parameters:
    ///   - domain: The name of the domain that you want to list apps for.
    ///   - maxResults: The maximum number of apps to list.
    ///   - nextToken: If SimSpace Weaver returns nextToken, then there are more results available.  The value of nextToken is a unique pagination token for each page. To retrieve the next page,  call the operation again using the returned token. Keep all other arguments unchanged. If no results remain,  then nextToken is set to null. Each pagination token expires after 24 hours.  If you provide a token that isn't valid, then you receive an HTTP 400 ValidationException error.
    ///   - simulation: The name of the simulation that you want to list apps for.
    ///   - logger: Logger use during operation
    @inlinable
    public func listApps(
        domain: String? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        simulation: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListAppsOutput {
        let input = ListAppsInput(
            domain: domain, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            simulation: simulation
        )
        return try await self.listApps(input, logger: logger)
    }

    /// Lists the SimSpace Weaver simulations in the Amazon Web Services account used to make the API call.
    @Sendable
    @inlinable
    public func listSimulations(_ input: ListSimulationsInput, logger: Logger = AWSClient.loggingDisabled) async throws -> ListSimulationsOutput {
        try await self.client.execute(
            operation: "ListSimulations", 
            path: "/listsimulations", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the SimSpace Weaver simulations in the Amazon Web Services account used to make the API call.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of simulations to list.
    ///   - nextToken: If SimSpace Weaver returns nextToken, then there are more results available.  The value of nextToken is a unique pagination token for each page. To retrieve the next page,  call the operation again using the returned token. Keep all other arguments unchanged. If no results remain,  then nextToken is set to null. Each pagination token expires after 24 hours.  If you provide a token that isn't valid, then you receive an HTTP 400 ValidationException error.
    ///   - logger: Logger use during operation
    @inlinable
    public func listSimulations(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListSimulationsOutput {
        let input = ListSimulationsInput(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listSimulations(input, logger: logger)
    }

    /// Lists all tags on a SimSpace Weaver resource.
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceInput, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceOutput {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/tags/{ResourceArn}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists all tags on a SimSpace Weaver resource.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource. For more information about ARNs, see Amazon Resource Names (ARNs) in the Amazon Web Services General Reference.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceOutput {
        let input = ListTagsForResourceInput(
            resourceArn: resourceArn
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// Starts a custom app with the configuration specified in the simulation schema.
    @Sendable
    @inlinable
    public func startApp(_ input: StartAppInput, logger: Logger = AWSClient.loggingDisabled) async throws -> StartAppOutput {
        try await self.client.execute(
            operation: "StartApp", 
            path: "/startapp", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Starts a custom app with the configuration specified in the simulation schema.
    ///
    /// Parameters:
    ///   - clientToken: A value that you provide to ensure that repeated calls to this API operation using the same parameters complete only once. A ClientToken is also known as an idempotency token. A ClientToken expires after 24 hours.
    ///   - description: The description of the app.
    ///   - domain: The name of the domain of the app.
    ///   - launchOverrides: 
    ///   - name: The name of the app.
    ///   - simulation: The name of the simulation of the app.
    ///   - logger: Logger use during operation
    @inlinable
    public func startApp(
        clientToken: String? = StartAppInput.idempotencyToken(),
        description: String? = nil,
        domain: String,
        launchOverrides: LaunchOverrides? = nil,
        name: String,
        simulation: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartAppOutput {
        let input = StartAppInput(
            clientToken: clientToken, 
            description: description, 
            domain: domain, 
            launchOverrides: launchOverrides, 
            name: name, 
            simulation: simulation
        )
        return try await self.startApp(input, logger: logger)
    }

    /// Starts the simulation clock.
    @Sendable
    @inlinable
    public func startClock(_ input: StartClockInput, logger: Logger = AWSClient.loggingDisabled) async throws -> StartClockOutput {
        try await self.client.execute(
            operation: "StartClock", 
            path: "/startclock", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Starts the simulation clock.
    ///
    /// Parameters:
    ///   - simulation: The name of the simulation.
    ///   - logger: Logger use during operation
    @inlinable
    public func startClock(
        simulation: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartClockOutput {
        let input = StartClockInput(
            simulation: simulation
        )
        return try await self.startClock(input, logger: logger)
    }

    /// Starts a simulation with the given name. You must choose to start your simulation from a schema or from a snapshot. For more information about the schema, see the schema reference  in the SimSpace Weaver User Guide. For more information about snapshots, see Snapshots in the SimSpace Weaver User Guide.
    @Sendable
    @inlinable
    public func startSimulation(_ input: StartSimulationInput, logger: Logger = AWSClient.loggingDisabled) async throws -> StartSimulationOutput {
        try await self.client.execute(
            operation: "StartSimulation", 
            path: "/startsimulation", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Starts a simulation with the given name. You must choose to start your simulation from a schema or from a snapshot. For more information about the schema, see the schema reference  in the SimSpace Weaver User Guide. For more information about snapshots, see Snapshots in the SimSpace Weaver User Guide.
    ///
    /// Parameters:
    ///   - clientToken: A value that you provide to ensure that repeated calls to this API operation using the same parameters complete only once. A ClientToken is also known as an idempotency token. A ClientToken expires after 24 hours.
    ///   - description: The description of the simulation.
    ///   - maximumDuration: The maximum running time of the simulation, specified as a number of minutes (m or M), hours (h or H), or days (d or D). The simulation  stops when it reaches this limit. The maximum value is 14D, or its equivalent in the  other units. The default value is 14D. A value equivalent to 0 makes the simulation immediately transition to Stopping as soon as it reaches Started.
    ///   - name: The name of the simulation.
    ///   - roleArn: The Amazon Resource Name (ARN) of the Identity and Access Management (IAM) role that the simulation assumes to perform actions. For more information about ARNs, see Amazon Resource Names (ARNs) in the Amazon Web Services General Reference. For more information about IAM roles, see IAM roles in the  Identity and Access Management User Guide.
    ///   - schemaS3Location: The location of the simulation schema in Amazon Simple Storage Service (Amazon S3). For more information about Amazon S3, see the  Amazon Simple Storage Service User Guide . Provide a SchemaS3Location to start your simulation from a schema. If you provide a SchemaS3Location then you can't provide a SnapshotS3Location.
    ///   - snapshotS3Location: The location of the snapshot .zip file in Amazon Simple Storage Service (Amazon S3). For more information about Amazon S3, see the  Amazon Simple Storage Service User Guide . Provide a SnapshotS3Location to start your simulation from a snapshot. The Amazon S3 bucket must be in the same Amazon Web Services Region as the simulation. If you provide a SnapshotS3Location then you can't provide a SchemaS3Location.
    ///   - tags: A list of tags for the simulation. For more information about tags, see Tagging Amazon Web Services resources in the Amazon Web Services General Reference.
    ///   - logger: Logger use during operation
    @inlinable
    public func startSimulation(
        clientToken: String? = StartSimulationInput.idempotencyToken(),
        description: String? = nil,
        maximumDuration: String? = nil,
        name: String,
        roleArn: String,
        schemaS3Location: S3Location? = nil,
        snapshotS3Location: S3Location? = nil,
        tags: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartSimulationOutput {
        let input = StartSimulationInput(
            clientToken: clientToken, 
            description: description, 
            maximumDuration: maximumDuration, 
            name: name, 
            roleArn: roleArn, 
            schemaS3Location: schemaS3Location, 
            snapshotS3Location: snapshotS3Location, 
            tags: tags
        )
        return try await self.startSimulation(input, logger: logger)
    }

    /// Stops the given custom app and shuts down all of its allocated compute resources.
    @Sendable
    @inlinable
    public func stopApp(_ input: StopAppInput, logger: Logger = AWSClient.loggingDisabled) async throws -> StopAppOutput {
        try await self.client.execute(
            operation: "StopApp", 
            path: "/stopapp", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Stops the given custom app and shuts down all of its allocated compute resources.
    ///
    /// Parameters:
    ///   - app: The name of the app.
    ///   - domain: The name of the domain of the app.
    ///   - simulation: The name of the simulation of the app.
    ///   - logger: Logger use during operation
    @inlinable
    public func stopApp(
        app: String,
        domain: String,
        simulation: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StopAppOutput {
        let input = StopAppInput(
            app: app, 
            domain: domain, 
            simulation: simulation
        )
        return try await self.stopApp(input, logger: logger)
    }

    /// Stops the simulation clock.
    @Sendable
    @inlinable
    public func stopClock(_ input: StopClockInput, logger: Logger = AWSClient.loggingDisabled) async throws -> StopClockOutput {
        try await self.client.execute(
            operation: "StopClock", 
            path: "/stopclock", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Stops the simulation clock.
    ///
    /// Parameters:
    ///   - simulation: The name of the simulation.
    ///   - logger: Logger use during operation
    @inlinable
    public func stopClock(
        simulation: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StopClockOutput {
        let input = StopClockInput(
            simulation: simulation
        )
        return try await self.stopClock(input, logger: logger)
    }

    /// Stops the given simulation.  You can't restart a simulation after you stop it. If you want to restart a simulation, then you must stop it, delete it, and start a new instance of it.
    @Sendable
    @inlinable
    public func stopSimulation(_ input: StopSimulationInput, logger: Logger = AWSClient.loggingDisabled) async throws -> StopSimulationOutput {
        try await self.client.execute(
            operation: "StopSimulation", 
            path: "/stopsimulation", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Stops the given simulation.  You can't restart a simulation after you stop it. If you want to restart a simulation, then you must stop it, delete it, and start a new instance of it.
    ///
    /// Parameters:
    ///   - simulation: The name of the simulation.
    ///   - logger: Logger use during operation
    @inlinable
    public func stopSimulation(
        simulation: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StopSimulationOutput {
        let input = StopSimulationInput(
            simulation: simulation
        )
        return try await self.stopSimulation(input, logger: logger)
    }

    /// Adds tags to a SimSpace Weaver resource. For more information about tags, see Tagging Amazon Web Services resources in the Amazon Web Services General Reference.
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceInput, logger: Logger = AWSClient.loggingDisabled) async throws -> TagResourceOutput {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/tags/{ResourceArn}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Adds tags to a SimSpace Weaver resource. For more information about tags, see Tagging Amazon Web Services resources in the Amazon Web Services General Reference.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource that you want to add tags to. For more information about ARNs, see Amazon Resource Names (ARNs) in the Amazon Web Services General Reference.
    ///   - tags: A list of tags to apply to the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceArn: String,
        tags: [String: String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TagResourceOutput {
        let input = TagResourceInput(
            resourceArn: resourceArn, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// Removes tags from a SimSpace Weaver resource. For more information about tags, see Tagging Amazon Web Services resources in the Amazon Web Services General Reference.
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceInput, logger: Logger = AWSClient.loggingDisabled) async throws -> UntagResourceOutput {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/tags/{ResourceArn}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes tags from a SimSpace Weaver resource. For more information about tags, see Tagging Amazon Web Services resources in the Amazon Web Services General Reference.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource that you want to remove tags from. For more information about ARNs, see Amazon Resource Names (ARNs) in the Amazon Web Services General Reference.
    ///   - tagKeys: A list of tag keys to remove from the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        resourceArn: String,
        tagKeys: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UntagResourceOutput {
        let input = UntagResourceInput(
            resourceArn: resourceArn, 
            tagKeys: tagKeys
        )
        return try await self.untagResource(input, logger: logger)
    }
}

extension SimSpaceWeaver {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: SimSpaceWeaver, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension SimSpaceWeaver {
    /// Return PaginatorSequence for operation ``listApps(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listAppsPaginator(
        _ input: ListAppsInput,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListAppsInput, ListAppsOutput> {
        return .init(
            input: input,
            command: self.listApps,
            inputKey: \ListAppsInput.nextToken,
            outputKey: \ListAppsOutput.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listApps(_:logger:)``.
    ///
    /// - Parameters:
    ///   - domain: The name of the domain that you want to list apps for.
    ///   - maxResults: The maximum number of apps to list.
    ///   - simulation: The name of the simulation that you want to list apps for.
    ///   - logger: Logger used for logging
    @inlinable
    public func listAppsPaginator(
        domain: String? = nil,
        maxResults: Int? = nil,
        simulation: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListAppsInput, ListAppsOutput> {
        let input = ListAppsInput(
            domain: domain, 
            maxResults: maxResults, 
            simulation: simulation
        )
        return self.listAppsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listSimulations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listSimulationsPaginator(
        _ input: ListSimulationsInput,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListSimulationsInput, ListSimulationsOutput> {
        return .init(
            input: input,
            command: self.listSimulations,
            inputKey: \ListSimulationsInput.nextToken,
            outputKey: \ListSimulationsOutput.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listSimulations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of simulations to list.
    ///   - logger: Logger used for logging
    @inlinable
    public func listSimulationsPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListSimulationsInput, ListSimulationsOutput> {
        let input = ListSimulationsInput(
            maxResults: maxResults
        )
        return self.listSimulationsPaginator(input, logger: logger)
    }
}

extension SimSpaceWeaver.ListAppsInput: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> SimSpaceWeaver.ListAppsInput {
        return .init(
            domain: self.domain,
            maxResults: self.maxResults,
            nextToken: token,
            simulation: self.simulation
        )
    }
}

extension SimSpaceWeaver.ListSimulationsInput: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> SimSpaceWeaver.ListSimulationsInput {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}
